//finally  es9里面的，node的11版本是支持的

let p = new Promise((resolve,reject) => {
    resolve(100);
});

Promise.prototype.finally = function(cb){
    return p.then(data => {
        //Promise.resolve会等待cb执行完成，如果cb返回的是一个promise，则会等这个promise执行完成
        return Promise.resolve(cb()).then(() => data);
    },err => {
        return Promise.resolve(cb()).then(() => {
            throw err
        });
    })
}

p.finally(() => {//finally无论成功失败都执行，返回的是一个promise实例，并且它是实例上的方法
    console.log("最终的");
    return new Promise((resolve,reject) => {
        setTimeout(() => {
            //这里执行成功或失败对下面结果的影响有很大不同哦，暂时还有点疑惑
            //reject(9);
            resolve(9);
        },3000);
    });
}).catch(err => {
    console.log(err);
}).then(res => {
    console.log(res);
    return "哈哈";
}).then(res => {
    console.log(res);
    return "呜呜";
});

//课后作业：实现Promise.resolve、Promise.race、Promise.try、Promise.catch。